package com.mfz.common.persistence.pojo

import com.mfz.common.dbHelper.dbHelper

/**
 * 这是一个将数据库代码转成POJO类的方法。
 *
 * 调用这个方法将会得到一个String，里面包含此对象的相关内容，可以直接将得到的内容放至代码内
 * 需要用到数据库连接对象和数据库使用对象
 */
fun generatePOJO(tableName: String): String {
	return buildString {
		val className = getName(tableName, true)

		//增加一个日期类型的引用
		append("import java.util.Date \n\n")

		//增加类头的行
		append("class ")
		append(className)
		append(" : AbstractPersistence(")
		append(className)
		append("Factory) {")

		//增加字段内容
		for (f in dbHelper.getTableInfo(tableName)) {
			val fieldName = getName(f.name)

			append("\tvar ")
			append(fieldName)
			append(": ")
			append(f.type.getJavaClassName())
			//是否必填修改
			if (!f.notNull) append("?")
			append("\n")
			append("\t\tget() = get(\"")
			append(f.name)
			append("\")")
			//增加不能为空标志
			if (f.notNull) append("!!")
			append("\n")
			append("\t\tset(value) {\n")
			append("\t\t\tset(\"")
			append("\", value)\n")
			append("\t\t}\n\n")

		}
//AbstractFactory<IssueRequirement>("issue_requirement", null)
		//增加类结束符
		append("}\n\n")

		//增加工厂类对象的返回
		append("object ")
		append(className)
		append("Factory : AbstractFactory<")
		append(className)
		append(">(\"")
		append(tableName)
		append("\", null) {\n")
		append("\toverride fun createNewObject(): ")
		append(className)
		append(" {\n")
		append("\t\treturn ")
		append(className)
		append("()\n")
		append("\t}\n}")
	}
}

private fun getName(origin: String, firstUpperCase: Boolean = false): String {
	var needUp = false
	return buildString {
		for (i in origin.indices) {
			//当前是符是下划线时，设置大写标志，以便下一个字符处理
			needUp = if (origin[i] == '_') {
				true
			} else {
				//前一个字符是'_'时，此字符大写
				if (needUp)
					append(origin[i].toUpperCase())
				else
				//如果需要首字母大写时的处理
					if (i == 0 && firstUpperCase)
						append(origin[i].toUpperCase())
					else
						append(origin[i])

				false
			}
		}
	}
}


